﻿//
//
/////////////////////////////////////////////////////////////////////////////
using System.Security.Cryptography;
using System.Text;

/////////////////////////////////////////////////////////////////////////////
namespace DataAccess
{
    /////////////////////////////////////////////////////////////////////////
    public class DbAccess : Singleton<DbAccess>
    {
        public readonly PhysicalEquationEntities Entities = new PhysicalEquationEntities();
    }

    /////////////////////////////////////////////////////////////////////////
    public sealed class UserValidation : Singleton<UserValidation>
    {
        /////////////////////////////////////////////////////////////////////
        public string CreatePassword(string userName, string password)
        {
            return _getPassword(password, userName);
        }

        /////////////////////////////////////////////////////////////////////
        public bool IsPasswordValid(string password, string userName, string hash)
        {
            return _getPassword(password, userName) == hash;
        }

        /////////////////////////////////////////////////////////////////////
        private string _getPassword(string password, string userName)
        {
            MD5 hash = MD5.Create();
            byte[] passwordData = hash.ComputeHash(Encoding.ASCII.GetBytes(userName + "@-/1" + password));
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < passwordData.Length; i++)
            {
                sb.Append(passwordData[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

    /////////////////////////////////////////////////////////////////////////
    public class Singleton<TClass> where TClass : class, new()
    {
        private static TClass _instance;

        /////////////////////////////////////////////////////////////////////
        protected Singleton()
        {

        }

        /////////////////////////////////////////////////////////////////////
        protected virtual void _init()
        {

        }

        /////////////////////////////////////////////////////////////////////
        private static class Creator
        {
            /////////////////////////////////////////////////////////////////
            internal static TClass GetInstance()
            {
                return new TClass();
            }
        }

        /////////////////////////////////////////////////////////////////////
        public static TClass Instance
        {
            get { return _instance ?? (_instance = Creator.GetInstance()); }
        }
    }
    /////////////////////////////////////////////////////////////////////////////
}//DataAccess
